package main

import "fmt"

//函数的定义
// func function_name( [parameter list] ) [return_types]
// {
//    函数体
// }

//求和函数
// func sum(a int, b int) (ret int) {
// 	ret = a + b
// 	return ret
// }

// //比较大小函数
// func compare(a int, b int) (max int) {
// 	if a > b {
// 		max = a
// 	} else {
// 		max = b
// 	}
// 	return max
// }

// func main() {
// 	A := sum(1, 2)
// 	fmt.Printf("A: %v\n", A)

// 	B := compare(56, 72)
// 	fmt.Printf("B: %v\n", B)
// }

//函数的返回值

//没有返回值
// func f1() {
// 	fmt.Println("俺没有返回值")
// }

// //多个返回值，且在return中指定返回的内容
// func f2() (name string, age int) {
// 	name = "skye"
// 	age = 20
// 	return name, age
// }

// //多个返回值，返回值名称未使用
// func f3() (name string, age int) {
// 	name = "skye"
// 	age = 20
// 	return //// 等价于return name, age
// }

// //return覆盖命名返回值，返回值名称没有被使用
// func f4() (name string, age int) {
// 	n := "skye"
// 	a := 20
// 	return n, a
// }

// //返回值为两个，第一个为值，第二个为bool类型 确认是否返回成功

// //返回值为多个，不需要的用_略去
// func f5() (int, int) {
// 	return 1, 2
// }
// func main() {
// 	//f1()
// 	// f2()
// 	// name, age := f2()
// 	// fmt.Printf("name: %v\n", name)
// 	// fmt.Printf("age: %v\n", age)
// 	// n, a := f3()
// 	// fmt.Printf("n: %v a:%v\n", n, a)
// 	// n, a := f4()
// 	// fmt.Printf("n: %v a:%v\n", n, a)
// 	_, v := f5()
// 	fmt.Printf("v: %v\n", v)
// }

//函数的参数
//传参
// func f1(a int, b int) int { //形参列表
// 	if a > b {
// 		return a
// 	} else {
// 		return b
// 	}
// }
// func f2(a int) { //值传递，不能改变main函数内部值
// 	a = 200
// 	fmt.Printf("a: %v\n", a)
// }

// //map slice interface channel 本身为指针类型 - 可能会改变函数内部的值
// func f3(a []int) {
// 	a[0] = 100
// }

// //变长数组
// func f4(args ...int) {
// 	for _, v := range args {
// 		fmt.Printf("v:%v\n", v)
// 	}
// }

// func f5(name string, age int, args ...int) {
// 	fmt.Printf("name: %v\n", name)
// 	fmt.Printf("age: %v\n", age)
// 	for _, v := range args {
// 		fmt.Printf("v: %v\n", v)
// 	}
// }

// func main() {
// 	// max := f1(23, 56) //实参列表
// 	// fmt.Printf("max: %v\n", max)

// 	// a := 100
// 	// f2(a)
// 	// fmt.Printf("a: %v\n", a)

// 	// a := []int{1, 2}
// 	// f3(a)
// 	// fmt.Printf("a: %v\n", a) //[100 2]

// 	f4(1, 2, 3)
// 	fmt.Println("------------")
// 	f4(1, 2, 3, 4, 5, 6, 7)
// 	fmt.Println("------------")
// 	f5("skye", 20, 1, 2, 3, 4)
// }

//函数类型与函数变量
//定义一个函数类型
//type fun func(int,int)int
func sum(a int, b int) int {
	return a + b
}
func max(a int, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

//定义一个fun函数类型，把sum和max赋值给它
type fun func(int, int) int

func main() {
	var f fun
	f = sum
	s := f(1, 2)
	fmt.Printf("s: %v\n", s)
	f = max
	m := f(23, 56)
	fmt.Printf("m: %v\n", m)
}
